package com.haohan.jingyuan.customer.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.haohan.jingyuan.customer.entity.CustomerInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 客户信息Mapper接口
 * 
 * @ClassName CustomerInfoMapper
 * @Description 客户信息数据访问层
 * @Author hexijun
 * @Time 2025/01/19 10:00
 * @Version 1.0
 */
@Mapper
public interface CustomerInfoMapper extends BaseMapper<CustomerInfo> {

    /**
     * 根据客户ID查询客户信息
     * 
     * @param customerId 客户ID
     * @return 客户信息
     */
    CustomerInfo findByCustomerId(@Param("customerId") String customerId);

    /**
     * 根据客户名称查询客户信息
     * 
     * @param name 客户名称
     * @return 客户信息
     */
    CustomerInfo findByName(@Param("name") String name);

    /**
     * 分页查询客户列表
     * 
     * @param page 分页对象
     * @param name 客户名称（可空）
     * @param industry 行业（可空）
     * @param owner 所属用户ID（可空）
     * @param category 分组（可空）
     * @param tags 标签（可空）
     * @param gmtCreatedStart 创建时间开始（可空）
     * @param gmtCreatedEnd 创建时间结束（可空）
     * @return 分页客户列表
     */
    IPage<CustomerInfo> selectCustomerListPage(Page<CustomerInfo> page,
                                               @Param("name") String name,
                                               @Param("industry") String industry,
                                               @Param("owner") String owner,
                                               @Param("category") String category,
                                               @Param("tags") String tags,
                                               @Param("gmtCreatedStart") Date gmtCreatedStart,
                                               @Param("gmtCreatedEnd") Date gmtCreatedEnd);

    /**
     * 统计使用指定分组的客户数量
     *
     * @param category 分组ID
     * @return 数量
     */
    int countByCategory(@Param("category") String category);

    /**
     * 通过 LIKE 预筛匹配包含指定标签编码的客户列表（需在Java端二次精确匹配）
     *
     * @param tagCode 标签编码
     * @return 客户列表
     */
    List<CustomerInfo> selectByTagsLike(@Param("tagCode") String tagCode);

    /**
     * 统计总客户数（未删除）
     *
     * @return 总客户数
     */
    Long countTotalCustomers();

    /**
     * 根据行业分组统计客户数量
     *
     * @return 分组统计结果列表，包含 industry 和 customerCount
     */
    List<java.util.Map<String, Object>> groupByIndustry();
}
